<?php
/**
 * 	Created on 29.04.2009
 *	@author Daniel Schmidt
 * 	OOP-Modellierungsklasse zur Abbildung eines Benutzer-Objekts
 * 	
 * 	In dieser Klasse werden alle Funktionen der Datenbank stedano_acl_users abgebildet
 */
 require_once 'toolkit/settings.php';
 require_once SERVERPATH . '/classes/DB.php';
 require_once SERVERPATH . '/classes/Error.php';
 require_once SERVERPATH . '/classes/Message.php';
 require_once SERVERPATH . '/classes/ACL.php';
 
 class User {
 	
 	// Instanzvariablen
 	private $mysql = null;
 	
 	public $userID = null;
 	public $username = null;
 	public $vorname = null;
 	public $nachname = null;
 	public $email = null;
 	public $datum_registriert = null;
 	public $ACL = null;
 	
 	
 	/** Konstruktor
 	 * 	Erzeugt ein neues Datenbankobjekt und mappt dies auf die Instanzvariable mysql
 	 * 	Weiterhin wird ein neues Objekt vom Typ User erzeugt und mit daten gefüllt,
 	 * 	sowie ein Objekt ACL (Zugriffskontrollliste).
 	 */
 	function __construct($userID = ''){
 		$this->mysql = new DB();	
 		if($userID != '') {									// UserID wird mit übergeben?
 			$this->userID = floatval($userID);				// Übergebene ID benutzen und in die Instanz speichern
 		} else {
 			$this->userID = floatval($_SESSION['userID']);	// UserID aus Server-Sessionvariablen holen
 			$this->confirm();								// Prüfen, ob Daten noch aktuell
 		}
 		$this->getUserData($this->userID);					// Andere Objekt-Daten anhand der ID aus der Datenbank lesen
 		$this->ACL = new ACL($this->userID);				// Generieren der Zugriffskontrollliste
 	}
 	
 	/** Holt die UserID's aller angemeldeter User und gibt sie als Array zurück
 	 * 	@return array Array mit allen UserIDs von angemeldeten Portalbenutzern
 	 */
 	function getAllUsers() {
 		// Initialisierung lokaler Variablen
 		$userArray = array();			
 		$uid = null;
 		
 		$query = "SELECT ID FROM stedano_acl_users";		// Query-String
 		if($stmt = $this->mysql->conn->prepare($query)) {	// Statement vorbereiten		
    		$stmt->execute();								// Statement abschießen
    		$stmt->bind_result($uid);						// Ergebnisse Binden
    		while($row = $stmt->fetch()) {					// Ergebnisarray durchgehen
    			array_push($userArray,$uid);				// ID an userArray anhängen
    		}		
    		$stmt->close();									// Statement beenden
 		} // of if stmt-prepare
 		return $userArray;									// Zurückgeben des Arrays
 		
 	}
 	
 	/** Prüfen, ob die übergebene Username/PW-Kombination so in der Datenbank vorhanden ist
 	 * 	@return boolean valid ja/nein
 	 */
 	function validate_user ($usr, $pwd) {
 		// Initialisierung von Lokalen Variablen
 		$uid = null;
 		
 		$query = 	"SELECT id
    					FROM stedano_acl_users
    					WHERE username = ? AND password = ? AND is_activated = 1
    					LIMIT 1";								// Query-String
    
    	if($stmt = $this->mysql->conn->prepare($query)) {		// Statement vorbereiten
    		$stmt->bind_param('ss', $usr, md5($pwd));			// Parameter an Stmt übergeben
    		$stmt->execute();							
    		$stmt->bind_result($uid);
    		if($stmt->fetch()) {								// Wenn Datensatz vorhanden ..
    			$_SESSION['userID'] = $uid;						// Setze UserID der Sessionvariablen		
    			$_SESSION['status'] = 'authorized';				// Setze Session-Flag
    			
 				header("location: index.php");					// Weiterleitung an Startseite
				$stmt->close();									// Statement beenden
    			return true;									// Rückgabewert
    		} else { // of if fetch
    			$stmt->close();									// Statement beenden
    			return false;									// Rückgabewert
    		} // of else
    	} // of if stmt-prepare
 		
 	} // of validate_user
 	
 	
  	/**
  	 *  Holen der Daten des Nutzers und füllen der Instanzvariablen
  	 *  @return void
  	 */
 	function getUserData ($uid) {
 		if($this->isUserIdValid($uid)) {
 			$username = null;
 			$email = null;
 			$ts_registered = null;
 			$lieblingsverein = null;
 			$hobby = null;
 			$vorname = null;
 			$nachname = null;
 	
 			$query = "SELECT username, email, UNIX_TIMESTAMP(ts_registered), lieblingsverein, hobby, vorname, nachname FROM stedano_acl_users WHERE ID = ? LIMIT 1";
 			if($stmt = $this->mysql->conn->prepare($query)) {	
 				$stmt->bind_param('i', $uid);		
    			$stmt->execute();						
    			$stmt->bind_result($username, $email, $ts_registered, $lieblingsverein, $hobby, $vorname, $nachname);
    			$stmt->fetch();
    			$stmt->close();	
    		
    			if(isset($username)) {
    				$this->username = $username;	
    				$this->email  = $email;
    				$this->ts_registered = $ts_registered;
    				$this->lieblingsverein = $lieblingsverein;
    				$this->hobby = $hobby;
    				$this->vorname = $vorname;
    				$this->nachname = $nachname;
    			} // of if isset(username)
 			} // of stmt-prepare
 		} // of isuseridvalid
 	} // of getuserdata
 	
 	
 	/** Benutzer ausloggen, sprich Session und Cookie zerstören 
 	 * @return void
 	 */
 	function logout() {
 		if(isset($_SESSION['status'])) {			// Sessionvariable gesetzt?
 			unset($_SESSION['status']);				// dann löschen derselben
 		
 			if(isset($_COOKIE[session_name()])) {	// Cookie gesetzt?
 				setcookie(session_name(), '', time() - 1000);	// Cookie zerstören
 				session_destroy();								// Session zerstören
 			}
 		}
 		if(isset($this->ACL)) {						// ACL-Tabelle vorhanden
 			unset($this->ACL);						// ACL-OBjekt zerstören
 		}
 	} // of logout
 	
 	/** Prüfen, ob die aktuelle Session des Benutzers noch aktiv und erlaubt ist, im Fehlerfall
 	 * 	Umleitung zum Login
 	 * 	@return void
 	 */
 	function confirm () {
 		session_start();
 		if($_SESSION['status'] != 'authorized') {		// Session-Flag nicht authorized
 		//	header("location:". SERVERPATH . "/login.php");
 		}
 	} // of confirm
 	
 	/**
 	 * HOlt den Namen des Benutzers aus der Datenbank und erwartet eine ID als Übergabewert
 	 * @param int Userid
 	 * @return string Benutzername
 	 */
 	function getUserNameFromId($uid) {
 		// Initialisierung von Lokalen Variablen
 		$uname = null;
 		
 		if($this->isUserIdValid($uid)) {			// Falls Userid in der Datenbank vorhanden
 			$query = "SELECT username FROM stedano_acl_users WHERE ID = ? LIMIT 1";		// SQL-Query-String
 			if($stmt = $this->mysql->conn->prepare($query)) {		
    			$stmt->bind_param('i', $uid);		
    			$stmt->execute();						
    			$stmt->bind_result($uname);			// Ergebnisstring an lokale Variable binden
    			$stmt->fetch();
    			$stmt->close();	
 			} // of stmt-prepare
    	} // of isuseridvalid
    	return $uname;								// Rückgabe des Benutzernamens
 	} // of getUserNameFromId
 	
 	/**
 	 * 	Holt die zugehörige UserID an Hand eines Benutzernamens aus der Datenbank
 	 * 	@param string Benutzername
 	 * 	@return int	Userid
 	 */
 	function getIdFromName($username) {
 		// Initialisierung von Lokalen Variablen
 		$uname = null;
 		$uid = null;
 		
 			$query = "SELECT id FROM stedano_acl_users WHERE username = ? LIMIT 1"; // SQL-Query
 			if($stmt = $this->mysql->conn->prepare($query)) {		
    			$stmt->bind_param('s', $username);		
    			$stmt->execute();						
    			$stmt->bind_result($uid);
    			$stmt->fetch();
    			$stmt->close();	
 			} // of stmt-prepare
    	
    	return $uid;				// Rückgabe der UserID
 	}	
 	
 	/**
 	 * 	Prüft, ob die übergebene Userid in der Datenbank vorhanden ist
 	 * 	@param int Userid
 	 * 	@return boolean True/False
 	 */
 	function isUserIdValid ($uid) {
 		$query = "SELECT id FROM stedano_acl_users WHERE id = ? LIMIT 1";
 		if($stmt = $this->mysql->conn->prepare($query)) {		
    		$stmt->bind_param('i', $uid);		
    		$stmt->execute();							
    		if($stmt->fetch()) {		// Ergebnismenge nach der Abfrage voranden											
    			return true;    			
    		}
    		else {
    			return false;
    		}
    		$stmt->close();	
    	}	
 	} // of isUserIdValig
 	
 	/** Prüft, ob der gewünschte Benutzername in der Datenbank noch nicht vorhanden und somit frei
 	 * 	zur Registrierung ist
 	 * 	@param string Username
 	 * 	@return boolean True/False
 	 */
 	function isUserNameValid($username) {
 		
 		$query = "SELECT id FROM stedano_acl_users WHERE username = ? LIMIT 1";
 			if($stmt = $this->mysql->conn->prepare($query)) {	
    			$stmt->bind_param('s', $username);		
    			$stmt->execute();							
    			if($stmt->fetch()) {						
    				new Error("Benutzername bereits vorhanden", false);					
    				return false;    	
    			}
    			else {
    				return true;
    			}
    			$stmt->close();	
    		}	
 	} // of isUserNameValid
 	
 	/**
 	 * 	Prüft, ob die bei der Registrierung erzeugte Activation-ID mit dem Eintrag in der Datenbank übereinstimmt
 	 * 	@param 	int UserID
 	 * 	@param 	string ActivationID
 	 * 	@return boolean true/false
 	 * 	@deprecated 1 - 15.06.2009
 	 */
 	function isActivationKeyValid($uid, $activationID) {
 		
 		if(isUserIdValid($uid)) {
 			$query = "SELECT id FROM stedano_acl_users WHERE id = ? AND activationID = ? LIMIT 1";
 			if($stmt = $this->mysql->conn->prepare($query)) {	
    			$stmt->bind_param('is', $uid, $activationID);		
    			$stmt->execute();							
    			if($stmt->fetch()) {						
    										
    				return true;    			
    			}
    			else {
    				new Error("Falscher Aktivierungs-Key", false);
    				return false;
    			}
    			$stmt->close();	
    		}	
 		}
 	} // of isActivationKeyValid
 	
 	/** Einen neuen Portaluser registrieren
 	 * 	@param string Benutzername aus dem Formular
 	 * 	@param string Password aus dem Formular
 	 * 	@param string E-Mail-Adresse aus dem Formular
 	 * 	@return booelean True/false -> Hat geklappt oder nicht
 	 */
 	function registerNewUser ($username, $password, $email) {
 		if($this->isUserNameValid($username)) {		// Username bereits vorhanden?
 			$query = "INSERT INTO stedano_acl_users
 					(username, password, email, ts_registered)
					VALUES (?, ?, ?, NOW())";
			if($stmt = $this->mysql->conn->prepare($query)) {	
					
    			$stmt->bind_param('sss', $username, md5($password), $email);		
    			if(!$stmt->execute()) {
    				return false;	
    			} else {
    				$this->activateNewUser($this->getIdFromName($username)); 	// DEBUG
    				return true;
    			}
    		$stmt->close();							
 			} 
 		} else {
 			return false;
 		}
 	} // of registerNewUser
 	
 
 	/**
 	 * 	Neuen Benutzer nach E-Mail-Verifikation aktivieren
 	 * 	@param int UserID
 	 * 	@return void
 	 * 	@deprecated 1 - 15.06.2009
 	 */
 	function activateNewUser ($uid) {
 		if($this->isUserIdValid($uid)) {
 			$query = "UPDATE stedano_acl_users SET is_activated = 1 WHERE id = ?";
 			if($stmt = $this->mysql->conn->prepare($query)) {		
    			$stmt->bind_param('i', $uid);		
    			if(!$stmt->execute()) {
    				new Error("Nutzer " . $uid . " konnte nicht aktiviert werden", false);	
    			}  else {
    				$this->setUserRole($uid, 2);
    			}	
    		$stmt->close();						
 			}	
    	}
 		
 	} // of activateNewUser
 	
 	/**
 	 * 	Benutzer aus der Datenbank entfernen inklusive aller Rechte aus der Rechtetabelle
 	 * 	@param void
 	 * 	@return void
 	 */
 	function deleteUser () {
 		
 		$this->ACL->deleteRolesAndPermsForUser();		// Löschen der Rechte über die Methode der ACL-Klasse
 		$query = "DELETE FROM stedano_acl_users WHERE ID = ?";
 		if($stmt = $this->mysql->conn->prepare($query)) {		
    			$stmt->bind_param('i', $this->userID);		
    			if(!$stmt->execute()) {
    				new Error("Löschen des Benutzers fehlgeschlagen", false);	
    			} else {
    				new Message("Benutzer " . $this->username . " erfolgreich gelöscht");
    			}
    		$stmt->close();						
 		}	
 	} // of deleteUser
 	
 	/** Benutzerdaten in die Datenbank eintragen
 	 * 	@param string Benutzername
 	 * 	@param string E-Mail-Adresse
 	 * 	@return void
 	 */
 	function setUserData ($username,
 							$email, 
 							$lieblingsverein='',
 							$hobby='', 
 							$vorname ='', 
 							$nachname='') 
 	{
 						
 		$query = "UPDATE stedano_acl_users SET
 					username = ?, email = ?,  lieblingsverein = ?, hobby = ?, vorname = ?, nachname = ? WHERE ID = ?";
 		if($stmt = $this->mysql->conn->prepare($query)) {		
 			
    			$stmt->bind_param('ssssssi', $username, $email, $lieblingsverein, $hobby, $vorname, $nachname, $this->userID);		
    			if(!$stmt->execute()) {
    				new Error("Bearbeitung der Nutzerdaten fehlgeschlagen", false);	
    			} else {
    				new Message("Bearbeitung erfolreich");
    				echo "<a href=\"user.php\">Zurück zum Profil</a>";
    			}
    		$stmt->close();						
 		}	// of stmt prepare
			
 	}	// of setUserData
 	
 	
 	/**
 	 * 	Setzen einer Rolle des Users
 	 * 	@param int UserID
 	 * 	@param int GruppenID
 	 */
 	function setUserRole ($uid, $gid) {
 		$query = "INSERT INTO stedano_acl_user_roles
 					(userID, roleID)
					VALUES (?, ?)";
		if($stmt = $this->mysql->conn->prepare($query)) {		
    			$stmt->bind_param('ii', $uid, $gid);		
    			if(!$stmt->execute()) {
    				new Error("Dem Nutzer " . $uid . " konnten keine Standardrechte gewährt werden", false);	
    			} 	
    		$stmt->close();						
 			}	
 	} // of setUserRole
 } // of class User
?>
